home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 4_0 / UUPC3 / MAC_SPEC / UNIX_LIB / NDIR.C < prev    next >
C/C++ Source or Header  |  1991-12-04  |  4KB  |  184 lines

  1. #ifdef THINK_C
  2. # include "unixlibproto.h"
  3. # include "stdlib.h"
  4. # include "string.h"
  5. #endif THINK_C
  6.  
  7. #include "ndir.h"
  8. #include <stdio.h>
  9.  
  10. #ifndef    THINK_C
  11. #include <pb.h>
  12. #endif    THINK_C
  13. #ifdef TEST
  14. #include <stdio.h>
  15. #define _DEBUG
  16. #include <max/debug.h>
  17. #endif
  18.  
  19. /*
  20.  * support for Berkeley directory reading routine on a V7 file system
  21.  */
  22.  
  23. /*
  24.  * open a directory.
  25.  */
  26.  
  27. DIR *
  28. opendir(name)
  29.     char *name; 
  30. {
  31.     static DIR dir;
  32.     register DIR *dirp = &dir;
  33.     register int fd;
  34.  
  35.     char         buf[255];
  36.     CInfoPBRec    cpb;
  37.     WDPBRec        wdpb;
  38.     int         err, currDir;
  39.  
  40.     /* remember current dir */
  41.     (void) GetVol((StringPtr) buf, &currDir);
  42.     /* fix name, and get volume reference number */
  43.  
  44.     cnvMac(name, buf);
  45.     
  46.     cpb.dirInfo.ioVRefNum = 0;
  47.     cpb.dirInfo.ioNamePtr = (StringPtr)CtoPstr(buf);
  48.     cpb.dirInfo.ioFDirIndex = 0;
  49.     cpb.dirInfo.ioDrDirID = 0L;
  50.  
  51. #ifdef TEST
  52.     fprintf( stderr, "opendir: %s\n", buf );
  53. #endif
  54.  
  55.     if ((err = PBGetCatInfo( &cpb, 0 )) != 0 ) {
  56. #ifdef TEST
  57.         fprintf( stderr, "setdir: PBGetCatInfo %d\n", err );
  58. #endif
  59.         return((DIR *)NULL);
  60.     }
  61. /**** repeated calls to malloc fill up system heap [3/24/90 garym]
  62.     if((dirp=(DIR *)malloc(sizeof(DIR))) == (DIR *)NULL) {
  63.         fprintf(stderr, "opendir: couldn't malloc %d got 0x%x\n", sizeof(DIR), dirp);
  64.         return((DIR *)NULL);
  65.     }
  66. ****/
  67.     dirp->ioVRefNum = cpb.dirInfo.ioVRefNum;
  68.     dirp->ioDrDirID = cpb.dirInfo.ioDrDirID;
  69.     dirp->ioFDirIndex = 1;
  70.     dirp->currdir = currDir;
  71. #ifdef    UNDEF
  72.     wdpb.ioCompletion = NULL;
  73.     wdpb.ioNamePtr = NULL;
  74.     wdpb.ioVRefNum = cpb.dirInfo.ioVRefNum;
  75.     wdpb.ioWDProcID = 'UUPC';
  76.     wdpb.ioWDDirID = cpb.dirInfo.ioDrDirID;
  77.     wdpb.ioWDIndex = wdpb.ioWDVRefNum = 0;
  78.     if (PBOpenWD(&wdpb, FALSE) != noErr) {
  79.         return((DIR *)NULL);
  80.     }
  81.     dirp->ioVRefNum = wdpb.ioVRefNum;    /* remember the WD id */
  82.     wdpb.ioVRefNum = 0;
  83.     if (SetVol((int)NULL, dirp->ioVRefNum ) != noErr) {
  84.         return((DIR *)NULL);
  85.     }
  86. #endif    UNDEF
  87. #ifdef TEST
  88.     fprintf( stderr, "opendir: # %ld\n", cpb.u.di.ioDrDirID );
  89. #endif
  90.  
  91.     return(dirp);
  92. }
  93.  
  94.  
  95. /*
  96.  * get next entry in a directory.
  97.  */
  98. struct direct *
  99. readdir(dirp)
  100. register DIR *dirp;
  101. {
  102.     CInfoPBRec cpb;
  103.     int err;
  104.     static struct direct dir;
  105.  
  106. #ifdef TEST
  107.     fprintf( stderr, "readdir: v:%d d:%ld i:%d\n", 
  108.             dirp->ioVRefNum, dirp->ioDrDirID, dirp->ioFDirIndex );
  109. #endif
  110.     strcpy( dir.d_name, "" );
  111.     cpb.dirInfo.ioNamePtr = (StringPtr)dir.d_name;
  112.     cpb.dirInfo.ioVRefNum = dirp->ioVRefNum;
  113.     cpb.dirInfo.ioDrDirID = dirp->ioDrDirID;
  114.     cpb.dirInfo.ioFDirIndex = dirp->ioFDirIndex++;
  115.  
  116.     if ((err = PBGetCatInfo( &cpb, 0 )) != 0 ) {
  117. #ifdef TEST
  118.         fprintf( stderr, "readdir: err %d\n", err );
  119. #endif
  120.         return NULL;
  121.     }
  122.  
  123.     dir.d_ino = 0;
  124.     PtoCstr( dir.d_name );
  125.  
  126. #ifdef TEST
  127.     fprintf( stderr, "readdir: OK \"%s\"\n",  dir.d_name);
  128. #endif
  129.  
  130.     dir.d_namlen = strlen(dir.d_name);
  131.     dir.d_reclen = DIRSIZ(&dir);
  132.     return (&dir);
  133.     
  134. }
  135.  
  136. /*
  137.  * close a directory.
  138.  */
  139. void
  140. closedir(dirp)
  141.     register DIR *dirp; {
  142.     WDPBRec    wdpb;
  143. #ifdef    UNDEF    
  144.     (void) (NULL, dirp->currdir);
  145.     wdpb.ioCompletion = NULL;
  146.     wdpb.ioNamePtr = NULL;
  147.     wdpb.ioVRefNum = dirp->ioVRefNum;
  148.     wdpb.ioWDProcID = 'UUPC';
  149.     wdpb.ioWDDirID = dirp->ioDrDirID;
  150.     wdpb.ioWDIndex = wdpb.ioWDVRefNum = 0;
  151.     PBCloseWD (&wdpb, FALSE);
  152. #endif    UNDEF
  153.     if(dirp != (DIR *)NULL)
  154.         free((char *)dirp);
  155.     else
  156.         fprintf(stderr, "closedir: tried to free NULL *directory\n");
  157. }
  158.  
  159.  
  160. #ifdef TEST
  161. #include <errno.h>
  162.  
  163. main()
  164. {
  165.     char command[100];
  166.  
  167.     struct DIR *dirp;
  168.     struct direct *dp;
  169.     
  170.     while(gets(command) != NULL) {
  171.  
  172.         fprintf( stderr, "test: %s\n", command );
  173.  
  174.         if ((dirp = opendir( command )) == NULL ) {
  175.             fprintf( stderr, "couldn't open dir %s\n", command );
  176.         }
  177.         while ((dp = readdir(dirp)) != NULL) 
  178.             fprintf( stderr, "%s", dp->d_name );
  179.  
  180.         closedir( dirp );
  181.     }
  182. }
  183. #endif
  184.